/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Vista;

import Controlador.Construccion;
import Modelo.*;
import Controlador.GestorConstrucciones;
import Controlador.GestorAmigos ;
import Controlador.Recursos;
import Vista.Datos ;
//import Modelo.Astillero;
//import Modelo.Coordenadas;
//import Modelo.Cuartel;
//import Modelo.Hangar;
//import Modelo.Juego;
//import Modelo.Mapa;
//import Modelo.Terreno;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import Controlador.GestorConstrucciones;
import java.util.ArrayList;

/**
 *
 * @author Carlos
 */
public class Mensaje {
    int estado;
    final static int INICIO=0;
    final static int MENU=1;
    final static int CONSTRUIR=2;
    final static int MILITAR=3;
    final static int GOBIERNO=4;
    final static int INDUSTRIA=5;
    final static int VIVIENDA=6;
    final static int CUARTEL=7;
    final static int ASTILLERO=8;
    final static int HANGAR=9;
    final static int CREAR=10;
    final static int RECOLECTAR=11;
    final static int CONTRATAR=12;
    final static int INVADIR=13;
    final static int CABANHA=14;
    final static int CASA=15;
    final static int BUNGALOW=16;
    final static int PALAFITO=17;
    final static int PARLAMENTO=18;
    final static int MANSION=19;
    final static int PALACIO=20;
    final static int INTENDENCIA=21;
    final static int POZOPETROLERO=22;
    final static int GRANJA=23;
    final static int MINADEMINERALES=24;
    final static int SOLDADO=25;
    final static int CANHON=26;
    final static int TANQUE=27;
    final static int CANHONERA=28;
    final static int PORTAVIONES=29;
    final static int ACORAZADO=30;
    final static int AVION=31;
    final static int HELICOPTERO=32;
    final static int BOMBARDERO=33;
    final static int ASERRADERO=34;
    final static int SALIR=35;
    final static int CREARCUALQUIERA=36;
    final static int COMBATIR=52;
    final static int FORMARTEAM = 53;
    final static int RECOLECTAR2=54;
    final static int CONTRATAR2 = 55 ;
    final static int INICIARBATALLA = 56;
    int xx,yy;
    static int xtemp = -1;
    static int ytemp = -1;




    Rectangle rec1;
    Recursos jugador;
    Mapa mapa;
    Juego juego;
    String Menu[]={"Construir","Crear","Recolectar","Invadir","Contratar"};
    String Construir[]={"Militar","Gobierno","Industria","Vivienda"};
    String Militar[]={"Cuartel","Astillero","Hangar"};
    String Gobierno[]={"Parlamento","Mansion","Palacio","Palafito"};
    String Industria[]={"PozoPetrolero","Granja","MinaDeMinerales","Aserradero"};
    String Vivienda[]={"Cabanha","Casa","Bungalow","Palafito"};
    String Cuartel[]={"Soldado","Canhon","Tanque"};
    String Astillero[]={"Canhonera","PortaAviones","Acorazado"};
    String Hangar[]={"Avion","Helicoptero","Bombardero"};
    public Mensaje(){
        Point p=new Point(0,500);
        Datos datos=new Datos(p);
        estado=0;
        rec1 = new Rectangle(0,0,40,50);
        //jugador =new Recursos();
        Terreno.inicializar(Grafico.applet);
        mapa = new Mapa();
        juego=new Juego("Ciudad",mapa);
        Datos.cargarMensajesDerecha();

    }



    public void mouse(java.awt.event.MouseEvent evt){
        int opcion;

        Grafico.g.drawString("Letra "+"  " +estado+" x "+evt.getX()+" y  "+evt.getY(), 800,380);

        //Grafico.g.drawString("Letra "+"  " +estado+" x "+evt.getX()+" y  "+evt.getY(), 800,380);
        //Grafico.g.drawString("Letra "+"  " +estado+" x "+x+" y  "+y, 800,380);

        Point p = new Point(evt.getX(),evt.getY());
        Militar apuntadito;
        if(evt.getButton()==MouseEvent.BUTTON3) {
            //turno;
            juego.turno();
        }
        else {
            switch(estado){
                case MENU:
                        opcion= Datos.getPos(p,5);
                        switch(opcion){
                            case 0:
                                estado=CONSTRUIR;
                                Datos.mostrarConstruir();
                                return;
                            case 1:
                                estado=CREAR;
                                Datos.mostrarCrear();
                                return;
                            case 2:
                                estado=RECOLECTAR;
                                //Datos.mostrar("entre a recolectar");
                                Datos.mostrarPrincipal("Elija la construccion para recolectar ");
                                return;
                            case 3:
                                estado=INVADIR;
                                Datos.mostrarAmigos();
                                return;
                            case 4:
                                estado = CONTRATAR ;
//                                Datos.mostrarAmigos();
                                Datos.mostrarPrincipal( "Elija el edificio donde desea contratar" ) ;
//                                Datos.mostrarContratar();
                                return;
                            default:
                                Datos.error();
                        }
                    break;
                case RECOLECTAR:
                    Datos.mostrarPrincipal("Elija Coordenadas");
                    System.out.println("entre a recolectar");
                    Object ob = mapa.getObjeto(p.x/25,(p.y-50)/25);
                    if(ob!=null && juego.sepuede(p.x/25,(p.y-50)/25) ) {
                        if(ob instanceof Militar ){
                            estado = RECOLECTAR2 ;
                            xx = p.x/25;
                            yy = (p.y-50)/25;
                            Datos.mostrarPrincipal("Elija coordenadas para ubicar unidad militar");
                            return;
                        }
                    }
                    if(mapa.ocupado(p.x/25,(p.y-50)/25)){
                        Datos.mostrarPrincipal("esta ocupado");
                        if(juego.sepuede(p.x/25,(p.y-50)/25) ) {
                            if(ob instanceof Militar ){
                                estado=RECOLECTAR2;
                                xx=p.x/25;
                                yy=(p.y-50)/25;
                                Datos.mostrarPrincipal("Elija coordenadas para ubicar unidad militar");
                                //Datos.mostrarPrincipal("Se recolecto satisfactoriamente");
                                return;
                            }
                            else{
                                juego.recolectar(p.x/25,(p.y-50)/25,-1,-1);
                                Datos.mostrar("Se recolecto satisfactoriamente");
                                //Datos.imprimirComandos();
                                estado=MENU;
                                return;
                            }
                        }
                    }
                    else Datos.mostrarPrincipal("No tiene edificio en esa construccion");
//                    if(juego.sepuedeRecolectar(p.x/25),(p.y-50)/25)){
//                        estado=RECOLECTAR2;
//                        Datos.mostrarPrincipal("Elija donde ubicar su unidad");
//                    }
                    //Datos.mostrar(null);
                    estado=MENU;
                    return;
                   //break;
                case RECOLECTAR2:
                        Datos.mostrar("Recolectar2");
                        juego.recolectar(xx, yy, p.x/25,(p.y-50)/25 );
                        //Datos.mostrar("Se recolecto satisfactoriamente");
                        estado=MENU;
                     return;
                case CONSTRUIR:
                    opcion=Datos.getPos(p,4);
                        switch(opcion){
                            case 0:
                                estado=MILITAR;
                                Datos.mostrarMilitar();
                                return;
                            case 1:
                                Datos.mostrarGobierno();
                                estado=GOBIERNO;
                                return;
                            case 2:
                                Datos.mostrarIndustria();
                                estado=INDUSTRIA;
                                return;
                            case 3:
                                Datos.mostrarVivienda();
                                estado=VIVIENDA;
                                return;
                        }
                     break;
                case CREAR:
                    Object apuntado = juego.mapa.getObjeto(evt.getX()/25, (evt.getY()-50)/25);
                    xtemp = evt.getX()/25;
                    ytemp = (evt.getY()-50)/25;

                    Construccion apuntado2;
                    if(apuntado instanceof Militar || apuntado instanceof Industria){
                        apuntado2 = (Construccion)apuntado;
                        if(apuntado2.getEstado() != -1){
                            //Grafico.g.drawString("La construccion esta en produccion", Datos.posM.x, Datos.posM.y);

                            Datos.mostrarPrincipal("La construccion esta en produccion");
                            
                            xtemp = -1;
                            ytemp = -1;
                            estado = INICIO;
                        }
                        else{
                            if(apuntado instanceof Cuartel){                                
                                Datos.mostrarCuartel();
                                Datos.mostrarDerecha(Datos.arrCuartel);
                                estado = CREARCUALQUIERA;
                            }
                            if(apuntado instanceof Astillero){
                                Datos.mostrarAstillero();
                                Datos.mostrarDerecha(Datos.arrAstillero);
                                estado = CREARCUALQUIERA;
                            }
                            if(apuntado instanceof Hangar){
                                Datos.mostrarDerecha(Datos.arrHangar);
                                Datos.mostrarHangar();
                                estado = CREARCUALQUIERA;
                            }
                            if(apuntado instanceof PozoPetrolero){
                                Datos.mostrarPozoPetrolero();
                                Datos.mostrarDerecha(Datos.arrPozo);
                                estado = CREARCUALQUIERA;
                            }
                            if(apuntado instanceof MinaDeMinerales){
                                Datos.mostrarMinaDeMinerales();
                                Datos.mostrarDerecha(Datos.arrMina);
                                estado = CREARCUALQUIERA;
                            }
                            if(apuntado instanceof Aserradero){
                                Datos.mostrarAserradero();
                                Datos.mostrarDerecha(Datos.arrAserradero);
                                estado = CREARCUALQUIERA;
                            }
                            if(apuntado instanceof Granja){
                                Datos.mostrarGranja();
                                Datos.mostrarDerecha(Datos.arrGranja);
                                estado = CREARCUALQUIERA;
                            }
                        }
                    }  
                    else{
                        Datos.mostrarPrincipal("Elija una posicion valida");
                        xtemp = -1;
                        ytemp = -1;
                        estado = INICIO;
                    }
                    return;

                case CREARCUALQUIERA:
                    Datos.cleanRight();
                    opcion=Datos.getPos(p,3);
                    Object apuntadin = juego.mapa.getObjeto(xtemp, ytemp);
                    if(apuntadin instanceof Militar){
                        Militar apuntadito2 = (Militar)apuntadin;
                        apuntadito2.asignarTrabajo(opcion+1);
                        //Grafico.g.drawString("asdfasdf", Datos.posM.x, Datos.posM.y);
                        //Datos.mostrarPrincipal("Se asigno la tarea correctamente");
                        estado = INICIO;
                        
                    }
                    if(apuntadin instanceof Industria){
                        Industria apuntadito3 = (Industria)apuntadin;
                        apuntadito3.asignarTrabajo(opcion+1);
                        estado = INICIO;
                    }

                    return;


                case MILITAR:
                    Datos.mostrarPrincipal("Elija las coordenadas");
                    opcion=Datos.getPos(p,3);
                    switch (opcion){
                        case 0:

                                estado=CUARTEL;
                                return;
                        case 1:
                                estado=ASTILLERO;
                                return;
                        case 2:
                                estado=HANGAR;
                                return;
                    }
                    break;
               case GOBIERNO:
                   Datos.mostrarPrincipal("Elija las coordenadas");
                    opcion=Datos.getPos(p,4);
                    switch (opcion){
                        case 0:
                                estado=PARLAMENTO;
                                return;
                        case 1:
                                estado=MANSION;
                                return;
                        case 2:
                                estado=PALACIO;
                                return;
                        case 3:
                                estado=INTENDENCIA;
                                return;
                    }
                    break;
              case INDUSTRIA:
                  Datos.mostrarPrincipal("Elija las coordenadas");
                    opcion=Datos.getPos(p,4);
                    switch (opcion){
                        case 0:
                                estado=POZOPETROLERO;
                                return;
                        case 1:
                                estado=GRANJA;
                                return;
                        case 2:
                                estado=MINADEMINERALES;
                                return;
                        case 3:
                                estado=ASERRADERO;
                                return;
                    }
               case VIVIENDA:
                    Datos.mostrarPrincipal("Elija las coordenadas");
                    opcion = Datos.getPos(p,4);
                    switch (opcion){
                        case 0:
                                estado=CABANHA;
                                return;
                        case 1:
                                estado=CASA;
                                return;
                        case 2:
                                estado=BUNGALOW;
                                return;
                        case 3:
                                estado=PALAFITO;
                                return;
                    }
                    break;
                case CABANHA:
                    juego.construir(p.x/25,(p.y-50)/25,3,1);
                    break;
                case CASA:
                    juego.construir(p.x/25,(p.y-50)/25,3,2);
                    break;
                case BUNGALOW:
                    juego.construir(p.x/25,(p.y-50)/25,3,3);
                    break;
                case PALAFITO:
                    juego.construir(p.x/25,(p.y-50)/25,3,4);
                    break;
                case PARLAMENTO:
                    juego.construir(p.x/25,(p.y-50)/25,4,1);
                    break;
                case MANSION:
                    juego.construir(p.x/25,(p.y-50)/25,4,2);
                    break;
                case PALACIO:
                    juego.construir(p.x/25,(p.y-50)/25,4,3);
                    break;
                case INTENDENCIA:
                    juego.construir(p.x/25,(p.y-50)/25,4,4);
                    break;
                case POZOPETROLERO:
                    juego.construir(p.x/25,(p.y-50)/25,2,1);
                    break;
                case GRANJA:
                    juego.construir(p.x/25,(p.y-50)/25,2,2);
                    break;
                case MINADEMINERALES:
                    juego.construir(p.x/25,(p.y-50)/25,2,3);
                    break;
                case ASERRADERO:
                    juego.construir(p.x/25,(p.y-50)/25,2,4);
                    break;
                case CUARTEL:
                     juego.construir(p.x/25,(p.y-50)/25,1,1);
                     break;
                case ASTILLERO:
                    juego.construir(p.x/25,(p.y-50)/25,1,2);
                    break;
                case HANGAR:
                    juego.construir(p.x/25,(p.y-50)/25,1,3);
                    break;
                case INVADIR:
                    opcion = Datos.getPos(p, 4);
                    if (opcion>=0 && opcion<4){
                        juego.invadir(opcion);
                        estado = COMBATIR;
                        Datos.mostrarEscenarios();
                    }
                    else
                        Datos.mostrar("prueba invadir fallada");
                    return;

                case COMBATIR:
                    opcion = Datos.getPos(p, 3);
                    if (opcion>=0 && opcion<3){
                        Datos.cleanDown();
                        juego.combatir(opcion);
                        estado = FORMARTEAM;
                    }
                    //estado=MENU;
                    return;
                case CONTRATAR:
                    Object cursor = juego.mapa.getObjeto(p.x / 25 ,(p.y - 50) / 25 ) ;
                    if( cursor != null ){
                        xx = p.x / 25 ;
                        yy = ( p.y - 50 ) / 25 ;
                        Datos.cleanDown() ;
                        Grafico.g.drawString("Selecciona el edificio donde quiere contratar a alguien", Datos.posM.x, Datos.posM.y + 15 );
                        Datos.mostrarContratar() ;
                        estado = CONTRATAR2 ;
                    }
                    return ;
                case CONTRATAR2:
                    opcion = Datos.getPos( p , 4 ) ;
                    if( opcion >= 0 && opcion <= 3 ){
                        cursor = juego.mapa.getObjeto( xx , yy ) ;
                        Datos.mostrar( "La opcion elegida es " + opcion ) ;
                        ((Gobierno)cursor).contratar( GestorAmigos.amigos.get( opcion ) ) ;
                        estado = MENU ;
                        return;
                    }

                case FORMARTEAM:

                    opcion = Datos.getPos(p,juego.getindice());
                    if (opcion>= 0 && opcion < 3){
                        juego.elegirEquipo(opcion);
                        juego.FormarEquipoCombate(juego.LimiteI,juego.LimiteS);
                        if (juego.myTeam.size() >=5 || juego.getindice()<=0){
                            
                            estado = INICIARBATALLA;
                        }
                        else estado = FORMARTEAM;
                    }
                    Datos.mostrarTeam(juego.myTeam.size());
                    return;
                case INICIARBATALLA:
                    int resultado = juego.iniciarBatalla();
                    if (resultado==0) Datos.mostrarPrincipal("PERDISTE");
                    if (resultado==1) Datos.mostrarPrincipal("GANASTE");
                    juego.actualizarArmada(resultado);
                    estado = INICIO;
                    return;
                    
                default:
                    Grafico.g.drawString("otra tecla", 0, 700);
                    estado = MENU;
                return;
            }
        }
        estado=MENU;
//        Datos.imprimirComandos();
//        mapa.mostrar();
        //Grafico.applet.repaint();
    }
    public void setEstado(java.awt.event.KeyEvent evt){
        Grafico.g.setColor(Color.yellow);
        //Grafico.g.drawString("Letra "+evt.getKeyChar()+"  " +estado, 700,300);
//        if(evt.getKeyChar()=='m')
//        {Grafico.g.drawString("esta es ",700,400);Datos.imprimirComandos();}
//        else Datos.mostrar("naaa");
        if(evt.getKeyCode()==KeyEvent.VK_ESCAPE){
            estado=SALIR;
            Datos.Salida();
        }
        else if(evt.getKeyCode()==KeyEvent.VK_LEFT){
            mapa.actualizaX(-1);
        }
        else if(evt.getKeyCode()==KeyEvent.VK_RIGHT){
            mapa.actualizaX(1);
        }
        else if(evt.getKeyCode()==KeyEvent.VK_DOWN){
            mapa.actualizaY(1);
        }
        else if(evt.getKeyCode()==KeyEvent.VK_UP){
            mapa.actualizaY(-1);
        }
        else if(estado == MENU)
        {
            Datos.imprimirComandos();
            return;
        }
        else if(estado == INICIO)
        {
            if( evt.getKeyCode()== KeyEvent.VK_M ){
                System.out.println("menu");
                Datos.mostrar("Inicio");
                estado=MENU;
                Datos.imprimirComandos();
            }
        }
        else if(estado==SALIR){

            if(evt.getKeyCode()==KeyEvent.VK_S) {
                //Grafico.g.drawImage(null, MENU, MENU, null);
                Grafico.applet.salida=true;
                return;
//                Grafico.g.clearRect(0,0,1000, 800);
//                Datos.salir();
//                Grafico.g.drawRect(0,0,1000, 800);
//                Grafico.g.fillRect(0,0,1000,800);
//                Grafico.g.setColor(Color.red);
//                Grafico.g.drawString("Saliste ", 0, 530);
                
            }
                else estado=INICIO;
        }
        Applet.inicio=false;
        mapa.mostrar();
    }
    public void cabecera(){
        Grafico.g.clearRect(0,0,1000, 50);
        Grafico.g.drawString(juego.reporte1(),10,20);
        Grafico.g.drawString(juego.reporte2(),10,40);
        
    }
    public void abajo(){
        Grafico.g.clearRect(0,500,1000,100);
        Grafico.g.drawRect(0, 500,1000,100);
        //Grafico.g.drawString("ABAJO",0,515);
    }
    public  void movimiento(Point p){
        int n;
        Grafico.g.clearRect(700,100,400,400);
        //esto pá borrar derechaaaaaaaa
        Grafico.g.clearRect(450, 50,1,450);
        Grafico.g.drawString("mouse"+p.x+" "+p.y,800,280);
        Grafico.g.drawString("otro mouse"+((p.y-50)/25)+" "+p.x/25,800,300);
        if(p.x>=0 && p.x/25<18 && p.y>=50 && (p.y-50)/25 <18){
            mapa.setCuadrado(p);
//            Grafico.g.setColor(Color.green);
//            Grafico.g.drawRect((p.x/25)*25,50+((p.y-50)/25)*25,25,25);
//            Grafico.g.setColor(Color.red);
        }
        switch(estado){
            case MENU:
                n=Datos.getPos(p, 5);
                //Datos.cleanDown();
                Datos.imprimirComandos();
                Grafico.g.drawLine(0, 500,1000,500);
                //Grafico.g.setColor(Color.yellow);
                if(n!=-1){
                    Datos.mostrarCoor(Menu[n],p.x,p.y);
//                    Grafico.g.drawRect(p.x,p.y-12, 70, 15);
//                    Grafico.g.drawString(Menu[n],p.x,p.y);
                }
                break;
            case CONSTRUIR:
                n=Datos.getPos(p, 4);
                Datos.cleanDown();
                Datos.mostrarConstruir();
                Grafico.g.drawLine(0, 500,1000,500);


                if(n!=-1)
                Datos.mostrarCoor(Construir[n],p.x,p.y);
                break;
            case MILITAR:
                n=Datos.getPos(p,3);
                Datos.cleanDown();
                Datos.mostrarMilitar();
                Grafico.g.drawLine(0, 500,1000,500);

                if(n!=-1)
                Datos.mostrarCoor(Militar[n],p.x,p.y);
                break;
            case VIVIENDA:
                n=Datos.getPos(p,4);
                Datos.cleanDown();
                Datos.mostrarVivienda();
                Grafico.g.drawLine(0, 500,1000,500);

                if(n!=-1)
                Datos.mostrarCoor(Vivienda[n],p.x,p.y);
                break;
            case GOBIERNO:
                n=Datos.getPos(p,4);
                Datos.cleanDown();
                Datos.mostrarGobierno();
                Grafico.g.drawLine(0, 500,1000,500);

                if(n!=-1)
                Datos.mostrarCoor(Gobierno[n],p.x,p.y);
                break;
            case INDUSTRIA:
                n=Datos.getPos(p,4);
                Datos.cleanDown();
                Datos.mostrarIndustria();
                Grafico.g.drawLine(0, 500,1000,500);

                if(n!=-1)
                Datos.mostrarCoor(Industria[n],p.x,p.y);
                break;
            
//            default:
//                Datos.mostrarPrincipal("estoy en otro estado");
//                return;
        }
        Grafico.g.setColor(Color.red);

        mapa.mostrar();
    }
}
